import axios from 'axios'
import { ElMessage } from 'element-plus'

// 创建axios实例
const service = axios.create({
    baseURL: 'http://localhost:8081', // API基础URL
    timeout: 10000 // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
    config => {
        // 在请求发送前添加token到header
        const token = localStorage.getItem('token')
        
        // 对于聊天相关的API，使用特殊的令牌或不添加令牌
        if (config.url && (
            config.url.includes('/api/admin/chat') || 
            config.url.includes('/api/admin/ai-response')
        )) {
            // 对于聊天API，使用特殊的令牌或不添加令牌
            config.headers['Authorization'] = 'Bearer admin-token'; // 使用固定的令牌
            console.log('使用特殊令牌访问聊天API:', config.url);
        } else if (token) {
            // 对于其他API，使用正常的令牌
            config.headers['Authorization'] = `Bearer ${token}`;
        }
        
        // 输出请求信息便于调试
        console.log(`${config.method.toUpperCase()} 请求: ${config.baseURL}${config.url}`, 
            config.params ? `参数: ${JSON.stringify(config.params)}` : '');
            
        return config
    },
    error => {
        console.error('请求错误:', error)
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    response => {
        const res = response.data

        // 如果返回的状态码不是200，则判断为错误
        if (res.code !== 200) {
            ElMessage({
                message: res.message || '错误',
                type: 'error',
                duration: 5 * 1000
            })

            // 处理401未授权错误
            if (res.code === 401) {
                // 清除token并跳转到登录页
                localStorage.removeItem('token')
                ElMessage.error('登录已过期，请重新登录')
                setTimeout(() => {
                    window.location.href = '/#/login'
                }, 1500)
            }

            return Promise.reject(new Error(res.message || '错误'))
        } else {
            return res
        }
    },
    error => {
        console.error('响应错误:', error)
        
        // 增强错误处理
        let errorMessage = '请求失败'
        
        if (error.response) {
            // 服务器返回错误状态码
            const status = error.response.status
            console.log(`响应状态码: ${status}`)
            
            switch (status) {
                case 400:
                    errorMessage = '请求参数错误'
                    break
                case 401:
                    errorMessage = '未授权，请重新登录'
                    // 清除token并跳转到登录页
                    localStorage.removeItem('token')
                    setTimeout(() => {
                        window.location.href = '/#/login'
                    }, 1500)
                    break
                case 403:
                    errorMessage = '拒绝访问'
                    break
                case 404:
                    errorMessage = '请求的资源不存在'
                    break
                case 500:
                    errorMessage = '服务器内部错误'
                    console.error('服务器错误详情:', error.response.data)
                    
                    // 特殊处理JWT错误
                    if (error.response.data && 
                        error.response.data.message && 
                        error.response.data.message.includes('JWT')) {
                        console.warn('JWT令牌错误，尝试重新登录');
                        localStorage.removeItem('token');
                        errorMessage = 'JWT令牌无效，请重新登录';
                        setTimeout(() => {
                            window.location.href = '/#/login';
                        }, 1500);
                    }
                    break
                default:
                    errorMessage = `请求失败(${status})`
            }
            
            // 记录详细错误信息
            if (error.response.data && error.response.data.message) {
                console.error('服务器返回的错误信息:', error.response.data.message)
                errorMessage = error.response.data.message
            }
        } else if (error.request) {
            // 请求已发送但没有收到响应
            errorMessage = '服务器无响应'
            console.warn('请求已发送但没有响应:', error.request)
        } else {
            // 请求设置时发生错误
            errorMessage = '请求配置错误'
            console.error('请求设置错误:', error.message)
        }
        
        // 对于聊天API的错误，可以特殊处理
        if (error.config && (
            error.config.url.includes('/api/admin/chat') || 
            error.config.url.includes('/api/admin/ai-response')
        )) {
            console.warn('聊天API错误，尝试使用备用方式处理');
            // 对于聊天API的错误，可以选择不显示错误消息
            return Promise.reject(error);
        }
        
        ElMessage({
            message: errorMessage,
            type: 'error',
            duration: 5 * 1000
        })
        
        return Promise.reject(error)
    }
)

export default service 